home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / library / ix_sigwinch.c < prev    next >
C/C++ Source or Header  |  1995-05-27  |  4KB  |  128 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *  Portions Copyright (C) 1994 Rafael W. Luebbert
  5.  *
  6.  *  This library is free software; you can redistribute it and/or
  7.  *  modify it under the terms of the GNU Library General Public
  8.  *  License as published by the Free Software Foundation; either
  9.  *  version 2 of the License, or (at your option) any later version.
  10.  *
  11.  *  This library is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  *  Library General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU Library General Public
  17.  *  License along with this library; if not, write to the Free
  18.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  *  $Id: ix_sigwinch.c,v 1.2 1994/06/19 15:13:17 rluebbert Exp $
  21.  *
  22.  *  $Log: ix_sigwinch.c,v $
  23.  *  Revision 1.2  1994/06/19  15:13:17  rluebbert
  24.  *  *** empty log message ***
  25.  *
  26.  */
  27. #define KERNEL
  28. #include "ixemul.h"
  29. #include "kprintf.h"
  30. #include <intuition/intuition.h>
  31. #include <devices/input.h>
  32. #include <devices/inputevent.h>
  33.  
  34. extern struct IOStdReq *CreateStdIO (struct MsgPort *);
  35.  
  36. static struct InputEvent *
  37. sigwinch_input_handler ()
  38. {
  39.   register struct InputEvent *_old_chain asm ("a0");
  40.   register struct Task *_me asm ("a1");
  41.   register struct InputEvent *old_chain = _old_chain;
  42.   register struct Task *me = _me;
  43.   struct user *user = (struct user *) me->tc_TrapData;
  44.   struct Window *w= user->u_window;
  45.   struct InputEvent *ie;
  46.   
  47.   for (ie = old_chain; ie; ie = ie->ie_NextEvent)
  48.       if (ie->ie_Class == IECLASS_SIZEWINDOW)
  49.           if (w == (struct Window *) ie->ie_EventAddress)
  50.             _psignal (me, SIGWINCH);
  51.  
  52.   /* always return the old chain, since we don't consume or generate events */
  53.   return old_chain;
  54. }
  55.  
  56.  
  57. void
  58. ix_install_sigwinch ()
  59. {
  60.   struct ConUnit *cu;
  61.   struct IOStdReq *ios;
  62.   struct InfoData *info;
  63.   struct Window *w;
  64.   struct MsgPort *handler;
  65.   struct Process *me = (struct Process *) FindTask(0);
  66.   struct StandardPacket *sp;
  67.  
  68.   info = alloca (sizeof (struct InfoData) + 2);
  69.   info = LONG_ALIGN (info);
  70.   bzero (info, sizeof (struct InfoData));
  71.   
  72.   sp = alloca (sizeof (struct StandardPacket));
  73.   sp = LONG_ALIGN (sp);
  74.  
  75.   handler = (struct MsgPort *) me->pr_ConsoleTask;
  76.   if (! handler)
  77.       return;
  78.     
  79.   __init_std_packet (sp);
  80.   sp->sp_Pkt.dp_Port = u.u_sync_mp;
  81.   sp->sp_Pkt.dp_Type = ACTION_DISK_INFO;
  82.   sp->sp_Pkt.dp_Arg1 = CTOBPTR (info);
  83.  
  84.   PutPacket (handler, sp);
  85.   __wait_sync_packet (sp);
  86.   if (sp->sp_Pkt.dp_Res1 != -1)
  87.       return;
  88.  
  89.   w = (struct Window *) info->id_VolumeNode;
  90.   if (! w) 
  91.       return;
  92.  
  93.   if (!(u.u_idev_req = CreateStdIO (u.u_sync_mp)))
  94.     return;
  95.  
  96.   if (OpenDevice ("input.device", 0, 
  97.           (struct IORequest *) u.u_idev_req, sizeof (struct IOStdReq)))
  98.     {
  99.       DeleteStdIO (u.u_idev_req);
  100.       u.u_idev_req = 0;
  101.       return;
  102.     }
  103.  
  104.   u.u_window = w;
  105.   u.u_idev_int.is_Code = (void *) sigwinch_input_handler;
  106.   u.u_idev_int.is_Data = (void *) me;
  107.   u.u_idev_int.is_Node.ln_Pri = 10;    /* must be before console.device */
  108.   u.u_idev_int.is_Node.ln_Name = "ixemul SIGWINCH handler";
  109.   u.u_idev_req->io_Data = (APTR) &u.u_idev_int;
  110.   u.u_idev_req->io_Command = IND_ADDHANDLER;
  111.   DoIO ((struct IORequest *) u.u_idev_req);
  112. }
  113.  
  114.  
  115. void
  116. ix_remove_sigwinch ()
  117. {
  118.   if (u.u_idev_req)
  119.     {
  120.       u.u_idev_req->io_Data = (APTR) &u.u_idev_int;
  121.       u.u_idev_req->io_Command = IND_REMHANDLER;
  122.       DoIO ((struct IORequest *) u.u_idev_req);
  123.       CloseDevice ((struct IORequest *) u.u_idev_req);
  124.       DeleteStdIO (u.u_idev_req);
  125.       u.u_idev_req = 0;
  126.     }
  127. }
  128.